bitkeeper revision 1.1230 (4219c6ad75ERLn-41qrS4GAxcsiIFQ)
authormaf46@burn.cl.cam.ac.uk <maf46@burn.cl.cam.ac.uk>
Mon, 21 Feb 2005 11:31:57 +0000 (11:31 +0000)
committermaf46@burn.cl.cam.ac.uk <maf46@burn.cl.cam.ac.uk>
Mon, 21 Feb 2005 11:31:57 +0000 (11:31 +0000)
Pass a struct xen_regs* to shadow_fault() instead of an error_code.

xen/arch/x86/shadow.c
xen/arch/x86/traps.c
xen/arch/x86/vmx.c
xen/include/asm-x86/shadow.h

index 294a8831411a3e03b1fa7911dfa1b00845c6051e..68243dd5114720ff638b3d5043ba0516e8b994f0 100644 (file)
@@ -601,13 +601,13 @@ void shadow_invlpg(struct exec_domain *ed, unsigned long va)
     }
 }
 
-int shadow_fault(unsigned long va, long error_code)
+int shadow_fault(unsigned long va, struct xen_regs *regs)
 {
     unsigned long gpte, spte = 0;
     struct exec_domain *ed = current;
     struct domain *d = ed->domain;
 
-    SH_VVLOG("shadow_fault( va=%p, code=%lu )", va, error_code );
+    SH_VVLOG("shadow_fault( va=%p, code=%lu )", va, regs->error_code );
 
     check_pagetable(d, ed->arch.guest_table, "pre-sf");
 
@@ -628,7 +628,7 @@ int shadow_fault(unsigned long va, long error_code)
         return 0;
     }
 
-    if ( (error_code & 2)  && !(gpte & _PAGE_RW) )
+    if ( (regs->error_code & 2)  && !(gpte & _PAGE_RW) )
     {
         /* Write fault on a read-only mapping. */
         return 0;
@@ -656,7 +656,7 @@ int shadow_fault(unsigned long va, long error_code)
     }
 
     /* Write fault? */
-    if ( error_code & 2 )  
+    if ( regs->error_code & 2 )  
     {
         if ( unlikely(!(gpte & _PAGE_RW)) )
         {
index a2ac58ad0ce5fc148f00ffe1eaa0cc1d9094df80..26cf436e070fb102aaf336b070da9b2e568d3c50 100644 (file)
@@ -289,7 +289,7 @@ asmlinkage int do_page_fault(struct xen_regs *regs)
              ptwr_do_page_fault(addr) )
         {
             if ( unlikely(shadow_mode_enabled(d)) )
-                (void)shadow_fault(addr, regs->error_code);
+                (void)shadow_fault(addr, regs);
             UNLOCK_BIGLOCK(d);
             return EXCRET_fault_fixed;
         }
@@ -297,7 +297,7 @@ asmlinkage int do_page_fault(struct xen_regs *regs)
     }
 
     if ( unlikely(shadow_mode_enabled(d)) && 
-         (addr < PAGE_OFFSET) && shadow_fault(addr, regs->error_code) )
+         (addr < PAGE_OFFSET) && shadow_fault(addr, regs) )
         return EXCRET_fault_fixed;
 
     if ( unlikely(addr >= LDT_VIRT_START(ed)) && 
index db5e5140dafb4237c114374348d7eea2410a3da3..a14a145521d293706e24dc99b7c62a9f983eea33 100644 (file)
@@ -105,7 +105,7 @@ static void inline __update_guest_eip(unsigned long inst_len)
 
 #include <asm/domain_page.h>
 
-static int vmx_do_page_fault(unsigned long va, unsigned long error_code
+static int vmx_do_page_fault(unsigned long va, struct xen_regs *regs
 {
     unsigned long eip;
     unsigned long gpa;
@@ -115,8 +115,8 @@ static int vmx_do_page_fault(unsigned long va, unsigned long error_code)
     {
         __vmread(GUEST_EIP, &eip);
         VMX_DBG_LOG(DBG_LEVEL_VMMU, 
-                "vmx_do_page_fault = 0x%lx, eip = %lx, erro_code = %lx",
-                va, eip, error_code);
+                "vmx_do_page_fault = 0x%lx, eip = %lx, error_code = %lx",
+                va, eip, regs->error_code);
     }
 #endif
 
@@ -137,7 +137,7 @@ static int vmx_do_page_fault(unsigned long va, unsigned long error_code)
     if (mmio_space(gpa))
         handle_mmio(va, gpa);
 
-    if ((result = shadow_fault(va, error_code)))
+    if ((result = shadow_fault(va, regs)))
         return result;
     
     return 0;       /* failed to resolve, i.e raise #PG */
@@ -757,7 +757,6 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs)
         int error;
         unsigned int vector;
         unsigned long va;
-        unsigned long error_code;
 
         if ((error = __vmread(VM_EXIT_INTR_INFO, &vector))
             && !(vector & INTR_INFO_VALID_MASK))
@@ -792,14 +791,14 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs)
         case TRAP_page_fault:
         {
             __vmread(EXIT_QUALIFICATION, &va);
-            __vmread(VM_EXIT_INTR_ERROR_CODE, &error_code);
+            __vmread(VM_EXIT_INTR_ERROR_CODE, &regs.error_code);
             VMX_DBG_LOG(DBG_LEVEL_VMMU, 
                     "eax=%lx, ebx=%lx, ecx=%lx, edx=%lx, esi=%lx, edi=%lx",
                         regs.eax, regs.ebx, regs.ecx, regs.edx, regs.esi,
                         regs.edi);
             ed->arch.arch_vmx.vmx_platform.mpci.inst_decoder_regs = &regs;
 
-            if (!(error = vmx_do_page_fault(va, error_code))) {
+            if (!(error = vmx_do_page_fault(va, &regs))) {
                 /*
                  * Inject #PG using Interruption-Information Fields
                  */
@@ -810,7 +809,7 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs)
                            INTR_INFO_DELIEVER_CODE_MASK |
                            TRAP_page_fault);
                 __vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields);
-                __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
+                __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, regs.error_code);
                 ed->arch.arch_vmx.cpu_cr2 = va;
             }
             break;
index 251096617c72e57eb1ac8dde379aa19de39a7eed..696ab786a6d99798a4c3db5a6c3082aee3180fcd 100644 (file)
@@ -38,7 +38,7 @@
 
 extern void shadow_mode_init(void);
 extern int shadow_mode_control(struct domain *p, dom0_shadow_control_t *sc);
-extern int shadow_fault(unsigned long va, long error_code);
+extern int shadow_fault(unsigned long va, struct xen_regs *regs);
 extern void shadow_l1_normal_pt_update(
     unsigned long pa, unsigned long gpte, 
     unsigned long *prev_spfn_ptr, l1_pgentry_t **prev_spl1e_ptr);